·什么是PHP伪协议?
是PHP支持的封装协议,共有一下12种:
- file:// — 访问本地文件系统
- http:// — 访问 HTTP(s) 网址
- ftp:// — 访问 FTP(s) URLs
- php:// — 访问各个输入/输出流(I/O streams)
- zlib:// — 压缩流
- data:// — 数据(RFC 2397)
- glob:// — 查找匹配的文件路径模式
- phar:// — PHP 归档
- ssh2:// — Secure Shell 2
- rar:// — RAR
- ogg:// — 音频流
- expect:// — 处理交互式的流
·CTF中也常用到PHP伪协议和文件包含漏洞这两种姿势相结合
php://filter
php://filter 是一种元封装器, 设计用于数据流打开时的筛选过滤应用。 这对于一体式(all-in-one)的文件函数非常有用,类似 readfile()、file() 和 file_get_contents(), 在数据流内容读取之前没有机会应用其他过滤器。在allow_url_fopen
(打开URL文件),allow_url_include
(引用URL文件)都关闭的情况下可以正常使用,主要用于读取源代码并进行base64编码输出。
在使用include()函数时,经常会造成任意文件读取的漏洞,我们就可以利用php://filter这样的元封装器对数据进行读取。
http://123.206.87.240:8005/post/index.php?file=php://filter/read=convert.base64-encode/resource=index.php
php://input
可以访问请求的原始数据的只读流,在POST请求中访问POST的data
部分,在enctype="multipart/form-data"
(将文件以二进制形式上传) 的时候php://input
是无效的。
1 | http://127.0.0.1/include.php?file=php://input |
若有写入权限,写入一句话木马
1 | http://127.0.0.1/include.php?file=php://input |
zip://,bzip2://,zlib://
zlib: 的功能类似 gzopen(),但是 其数据流还能被 fread() 和其他文件系统函数使用。 自 PHP 4.3.0 后这个不建议被使用,因为会和其他带“:”字符的文件名混淆; 请使用 compress.zlib:// 作为替代。
compress.zlib://*、 *compress.bzip2:// 和 gzopen()、bzopen() 是相等的。并且可以在不支持 fopencookie 的系统中使用。
ZIP 扩展 注册了 zip: 封装器。 自 PHP 7.2.0 和 libzip 1.2.0+ 起,加密归档开始支持密码,允许数据流中使用密码。 字节流上下文(stream contexts)中使用 ‘password’ 选项设置密码。
可选项
- zlib://file.gz
- bzip2://file.bz2
- zip://archive.zip#dir/file.txt
——php.net
简单说就是直接访问压缩包里的文件。
1. zip://
将phpinfo.txt压缩成zip,实战中可以改后缀为jpg绕过上传限制。
注意要用绝对路径+url编码#
2. zlib://
改后缀为jpg亦可,相对路径亦可。
3. bzip2://
同理于zlib://